---
title: 为安全HDFS配置PXF
---

为您的HDFS文件系统启用Kerberos时，作为HDFS客户端的PXF需要principal文件和keytab文件来验证对HDFS的访问。要在安全的HDFS上读取或写入文件，必须创建和部署PXF的Kerberos主体和keytab文件，并确保Kerberos身份验证已启用并起作用。


## <a id="prereq"></a>准备


在你配置PXF去访问需要安全访问的HDFS文件系统之前，确保你已经做到：

- 按照[Configuring PXF](instcfg_pxf.html)章节秒速初始化、配置和启动PXF，包括PXF功能和Hadoop用户模拟功能启用

- 根据特定分发的说明为Hadoop集群启用Kerberos，并验证配置。

- 确保HDFS的配置参数`dfs.block.access.token.enable`已经被设置成了`true`。你可以在你hadoop集群的`hdfs-site.xml`配置文件中找到该配置。

- 注意每个Greenplum数据库segment主机（\<seghost\>）和Kerberos密钥分发中心\(KDC\) \<kdc-server\>主机的主机名或IP地址

- 注意群集所在的Kerberos \<realm\> 的名称。


## <a id="procedure"></a>过程

按照如下流程为有安全的HDFS配置PXF。您将在Kerberos KDC服务器和Greenplum数据库segment主机上执行操作。

**登录到Kerberos KDC服务主机执行如下操作**:

1.  使用`root`账户登录到 Kerberos KDC 服务主机。


    ``` shell
    $ ssh root@<kdc-server>
    root@kdc-server$
    ```

2. 如果你的集群主机不存在配置文件的话，需要在KDC服务主机上分发`/etc/krb5.conf`配置文件到GPDB的**每一个**的segment节点，例如:

    ``` shell
    root@kdc-server$ scp /etc/krb5.conf seghost:/etc/krb5.conf
    ```

3.  使用`kadmin.local`命令为GPDB的每个segment节点主机创建一个Kerberos PXF服务主体。服务主体的格式应为`gpadmin/<seghost>@<realm>`，其中\<seghost\>是segment主机系统的DNS可解析的全限定主机名（`hostname -f`命令的输出）。例如，以下命令在名为EXAMPLE.COM的Kerberos领域中为名为`host1.example.com，host2.example.com`和`host3.example.com`的主机创建PXF服务主体:

    ``` shell
    root@kdc-server$ kadmin.local -q "addprinc -randkey -pw changeme gpadmin/host1.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "addprinc -randkey -pw changeme gpadmin/host2.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "addprinc -randkey -pw changeme gpadmin/host3.example.com@EXAMPLE.COM"
    ```

4.  为每个Kerberos PXF服务主体生成一个密钥表文件。 将密钥表文件保存在任何方便的位置（本示例使用目录`/etc/security/keytabs`）。 您将在以后的步骤中将keytab文件部署到它们各自的Greenplum数据库segment主机。 例如：

    ``` shell
    root@kdc-server$ kadmin.local -q "xst -norandkey -k /etc/security/keytabs/pxf-host1.service.keytab gpadmin/host1.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "xst -norandkey -k /etc/security/keytabs/pxf-host2.service.keytab gpadmin/host2.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "xst -norandkey -k /etc/security/keytabs/pxf-host3.service.keytab gpadmin/host3.example.com@EXAMPLE.COM"
    ```

    根据需要重复`xst`命令用以在每个PXF服务主体上生成一个秘钥表。

5.  列出principals:

    ``` shell
    root@kdc-server$ kadmin.local -q "listprincs"
    ```

6.  将每个PXF服务主体的密钥表文件复制到其各自的segment主机。 例如，以下命令在`PXF_CONF=/usr/local/greenplum-pxf`时，将在步骤4中生成的每个主体复制到segment主机上的PXF默认keytab目录中

    ``` shell
    root@kdc-server$ scp /etc/security/keytabs/pxf-host1.service.keytab host1.example.com:/usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ scp /etc/security/keytabs/pxf-host2.service.keytab host2.example.com:/usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ scp /etc/security/keytabs/pxf-host3.service.keytab host3.example.com:/usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    ```

    Note the file system location of the keytab file on each PXF host; you will need this information for a later configuration step.

7.  更改`pxf.service.keytab`文件的属主和权限。 这些文件必须仅由`gpadmin`用户拥有并可读。 例如:

    ``` shell
    root@kdc-server$ ssh host1.example.com chown gpadmin:gpadmin /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host1.example.com chmod 400 /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host2.example.com chown gpadmin:gpadmin /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host2.example.com chmod 400 /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host3.example.com chown gpadmin:gpadmin /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host3.example.com chmod 400 /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    ```

**在每个GPDB的segment节点执行以下步骤**:

1. 登录segment节点，例如:

    ``` shell
    $ ssh gpadmin@<seghost>
    ```

2. 如果在Greenplum的各个segment节点上Kerberos客户端包还没有被安装，那么首先安装他们。您必须具有超级用户权限才能安装操作系统软件包。 例如:

    ``` shell
    root@seghost$ rpm -qa | grep krb
    root@seghost$ yum install krb5-libs krb5-workstation
    ```

4. 打开 `pxf-env.sh`用户配置文件。例如使用vi命令打开`PXF_CONF=/usr/local/greenplum-pxf`:

    ``` shell
    gpadmin@seghost$ vi /usr/local/greenplum-pxf/conf/pxf-env.sh
    ```

5. 更新`PXF_KEYTAB` 和 `PXF_PRINCIPAL` 配置. 指定keytab 文件 和 Kerberos principal的位置。这些设置的默认值如下所示:

    ``` shell
    export PXF_KEYTAB="${PXF_CONF}/keytabs/pxf.service.keytab"
    export PXF_PRINCIPAL="gpadmin/_HOST@EXAMPLE.COM"
    ```

    PXF automatically replaces ` _HOST` with the FQDN of the segment host.

6. 在segment上重启PXF服务:

    ``` shell
    gpadmin@seghost$ $GPHOME/pxf/bin/pxf restart
    ```